{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Hadoop海量数据实现原理"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 集群计算面对的问题"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 节点故障：\n",
    "1000台服务器的集群=》平均故障率 1次/天\n",
    "100万台服务器的集群=》平均故障率1000次/天\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 如何保持数据的持续性：\n",
    "某些节点故障的情形下不影响数据的使用\n",
    "长时间集群的运算，如何应对节点的故障\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Hadoop分布式集群"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### hadoop是依据mapreduce的原理，用Java语言实现的分布式处理机制；Hadoop是一个能够对大量数据进行分布式处理的软件框架，实现了Google的MapReduce编程模型和框架，能够把应用程序分割成许多的小的工作单元，并把这些单元放到任何集群节点上执行；MapReduce是Hadoop中的一个数据运算核心模块"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Map-Reduce集群运算问题的解决方案"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 在多节点上冗余地存储数据，以保证数据的持续性；将计算移向数据端，以最大程度减少数据移动；简单的程序模型，隐藏所有的复杂度\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 分布式文件系统"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 服务器块：\n",
    "文件被分作16-64MB大小的连续块\n",
    "每个文件块会被重复的存储2到3次\n",
    "尽量保证重复的数据块在不同的机架上\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 主节点：\n",
    "Hadoop的HDFS里叫做Name节点\n",
    "存储元数据记录文件存储结构和地址\n",
    "最常见的操作为读取和追加数据\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 文件访问的客户端库：\n",
    "询问主节点以获取块服务器地址\n",
    "直接连接相应服务器块获取数据\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Map Reduce变换数据\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Hadoop组成\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Hadoop Common \n",
    "\t工具包，为其它hadoop模块提供基础设施\n",
    " Hadoop HDFS\n",
    "\t分布式文件系统，对海量数据存储\n",
    " Map-Reduce\n",
    "\t分布式处理策略，计算模型，对海量数据处理\n",
    "Yarn\n",
    "\t分布式资源管理，调度\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Map-Reduce：总览\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Map\n",
    "逐个文件逐行扫描\n",
    "扫描的同时抽取出我们感兴趣的内容（Keys）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Group by key\n",
    "排序和洗牌"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Reduce\n",
    "聚合，总结，过滤或转换\n",
    "写入结果"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Map-Reduce：环境\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 运行Map-Reduce模型，还需要hadoop环境解决\n",
    "对原始数据进行区分(Partition)\n",
    "调度程序在一系列的机器集群上都并行运行\n",
    "执行中间过程的group by key 步骤\n",
    "处理运行过程中的突发节点故障\n",
    "处理并行运行过程中的节点和节点之间的通信\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 数据流"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 输入和输出都被存储在分布式文件系统HDFS上；实际调度操作时，调度器会尽可能将map任务移至靠近数据物理存储的节点上；中间结果将会被存储在map和reduce操作的本地文件系统上；实际运行过程中，一个Map-Reduce产生的结构，很有可能作为另一个Map-Reduce任务的输入\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# reduce需要写函数，map有时候都不用写\n",
    "# map工作主要修改key ，reduce主要修改values\n",
    "# 对已有的算法进行map-reduce化\n",
    "# map 对一个键值对输入产生一序列中间键值对\n",
    "# map函数将对所有输入键值对操作\n",
    "# 相同的key 值 v 被reduce放一起，Reduce函数对每一个不同的key进行操作\n",
    "# map和reduce属于分治思想，通过hash分桶来处理，map是发散的过程，reduce是收敛的过程\n",
    "# map任务数目要远大于Reduce\n",
    "# map-reduce会有输入和输出，输出后再次进入map-reduce，如此循环迭代，在磁盘级别的操作，所以开销会很大，spark是在内存级别的操作，所有对内存开销会很大，但速度很快\n",
    "# spark稳定不如map，spark只读一次\n",
    "# map-reduce主要做特征的转换，数据的提取，转换，处理，写入\n",
    "# 做特征的用map，reduce，导出的特征用于机器学习训练的用spark建模， 用hadoop streaming方便任何语言编写map-reduce"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Hive"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Spark和Hive介绍\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Hive\n",
    "# 在Hadoop的Map-Reduce之上提供的类SQL数据提取操作功能\n",
    "\n",
    "# Spark\n",
    "# 分布式计算框架，是Map-Reduce替代方案，兼容HDFS和Hive，\n",
    "# 可兼容hadoop生态，弥补Mapduce不足\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Hive\n",
    "Hive是基于Hadoop的一个数据仓库工具，可以将结构化的数据文件映射为一张数据库表，并提供简单的sql查询功能，可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低，可以通过类SQL语句快速实现简单的MapReduce统计，十分适合数据仓库的统计分析\t\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Hive架构介绍"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 用户接口三个：CLI，Client 和 WUI。在启动 Client模式的时候，需要指出Hive Server在哪个节点启动，WUI是通过浏览器访问Hive\n",
    "# Hive将元数据存储在数据库中，如mysql。Hive中的元数据包括表的名字，表的列和分区及其属性，表的属性，表的数据所在目录等。\n",
    "# HQL生成的查询计划存储在HDFS中，并在随后有MapReduce调用执行。  　　\n",
    "# Hive的数据存储在HDFS中，大部分的查询、计算由MapReduce完成\t\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 关联规则挖掘"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 每一个样本叫一个项目\n",
    "# 一个顾客购买商品的购物车，项目的组合叫事务\n",
    "# 事务中有意义的项目集合叫做项集，比如面包和牛奶，就是二项集\n",
    "# 我们要挖掘的是项集\n",
    "\n",
    "# 1000个人购物，1000个购物单，牛奶在购物单中出现的次数叫支持度\n",
    "# 当支持度高到一定程度，才会观测出有意义的信息和规则，设定一个阈值\n",
    " \n",
    "# 项集A在事务数据库D中出现的次数占D中总事务的百分比叫做项集的支持度。如果项集的支持度超过用户给定的最小支持度阈值，就称该项集是频繁项集(或频集)\n",
    "\n",
    "\t"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 支持度：关联规则产出的是规则，找到频繁项集，再找出有意义的规则，支持度确定哪些是经常出现的\n",
    "\n",
    "\n",
    "# 信任度：信任度产出规则，知道X和Y是一个频繁项目集  ，谁对谁的影响更大\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Apriori算法\n",
    "\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Apriori算法命名源于算法使用了频繁项集性质的先验(Prior)知识\n",
    " \n",
    "# Apriori算法将发现关联规则的过程分为两个步骤: \n",
    "\n",
    "# \t1. 通过迭代，检索出事务数据库中的所有频繁项集，即支持度不\t    低于用户设定的阈值的项集\n",
    "# \t2. 利用频繁项集构造出满足用户最小信任度的规则 \n",
    " \n",
    "# 挖掘或识别出所有频繁项集是该算法的核心，占整个计算量的大部分\n",
    " \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
